package br.com.vti.leilao.model.annotation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * Classe utilizada na validação da anotação CPF.
 * 
 * @author Ednardo Rubens
 * 
 */
public class ValidatorCPF implements ConstraintValidator<CPF, String> {

    /* (non-Javadoc)
     * @see javax.validation.ConstraintValidator#initialize(java.lang.annotation.Annotation)
     */
    @Override
    public void initialize(CPF cpf) {
    }

    private boolean temCaracteresDiferentes(String cpf) {
        boolean retorno = false;
        for (int j = 1; j < cpf.length(); j++) {
            retorno = (cpf.charAt(j) != cpf.charAt(0));
        }
        return retorno;
    }

    /* (non-Javadoc)
     * @see javax.validation.ConstraintValidator#isValid(java.lang.Object, javax.validation.ConstraintValidatorContext)
     */
    @Override
    public boolean isValid(String cpf, ConstraintValidatorContext constraintContext) {
        if (cpf != null && cpf.length() == 11) {
            String numero = cpf.substring(0, 9);
            String digito = cpf.substring(9, 11);

            if (!temCaracteresDiferentes(numero)) {
                return false;
            }

            int d1 = 0;
            int d2 = 0;

            for (int i = 0; i < numero.length(); i++) {
                int aux = Integer.parseInt(numero.substring(i, i + 1));
                d1 += (10 - i) * aux;
                d2 += (11 - i) * aux;
            }

            int digito1 = ((d1 % 11) < 2) ? 0 : (11 - (d1 % 11));

            d2 += 2 * digito1;

            int digito2 = ((d2 % 11) < 2) ? 0 : (11 - (d2 % 11));

            String nDigResult = String.valueOf(digito1) + String.valueOf(digito2);

            return digito.equals(nDigResult);
        }
        return false;
    }
}
